package com.ytjj.qmyx.mall.mapper;

import com.ytjj.qmyx.mall.model.*;
import com.ytjj.qmyx.mall.model.dto.AppNewLifeHallIndexOldForNewProductDto;
import com.ytjj.qmyx.mall.model.dto.OldForNewProductDto;
import com.ytjj.qmyx.mall.model.response.*;
import com.ytjj.qmyx.mall.model.vo.HighestVolumeProductVO;
import com.ytjj.qmyx.mall.model.vo.ProductHelpWorkVo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 商品Dao
 *
 *
 * @version 1.0
 * 
 */
public interface ProductDao {

    /**
     * 查询专栏商品列表
     *
     * @param specialId 专栏id
     * @param type      排序类型
     * @return
     */
    List<Product> queryProductListBySpecialId(@Param("specialId") Integer specialId,
                                              @Param("type") String type,
                                              @Param("sex") Integer sex,
                                              @Param("ageStr") String ageStr,
                                              @Param("dataType") String dataType,
                                              @Param("platformData") String platformData);

    /**
     * 根据类型查询研究所商品列表
     *
     * @param specialId
     * @param type
     * @return
     */
    List<Product> queryGraduateProductListByType(@Param("specialId") Integer specialId,
                                                 @Param("type") String type);

    /**
     * 获取直播商品列表
     *
     * @return
     */
    List<Product> getLiveProductList();

    Integer getProductBy(Integer id);

    /**
     * 获取推荐商品列表
     *
     * @param specialId
     */
    List<Product> queryRecommendProductListBySpecialId(@Param("specialId") Integer specialId);

    List<ProductHelpWorkVo> MyExclusive(@Param("type")Integer type, @Param("userId")Integer userId);

    ProductHelpWorkVo MyExclusiveId(@Param("id")Integer id);

    /**
     * 获取不等于这个专区的商品列表
     *
     * @param specialId
     * @param type
     * @return
     */
    List<Product> queryRecommendProductListByNowSpecialId(@Param("specialId") Integer specialId, @Param("type") String type);

    /**
     * 查询商品列表
     *
     * @param type
     * @param sex
     * @param ageStr
     * @return
     */
    List<Product> queryProductList(@Param("type") String type,
                                   @Param("sex") Integer sex,
                                   @Param("ageStr") String ageStr,
                                   @Param("dataType") String dataType,
                                   @Param("platformData") String platformData);


    /**
     * 查询商品列表 同上面差别在于这里限制了商品的售价
     * @param type
     * @param sex
     * @param ageStr
     * @return
     */
    List<Product> queryProductListFixPrice(@Param("type") String type,
                                           @Param("sex") Integer sex,
                                           @Param("ageStr") String ageStr,
                                           @Param("dataType") String dataType,
                                           @Param("platformData") String platformData,
                                           @Param("fixPrice") BigDecimal fixPrice);

    /**
     * 获取专区推荐商品
     *
     * @param specialId
     * @return
     */
    List<Product> querySpecialRecommendProduct(@Param("specialId") Integer specialId,
                                               @Param("dataType") String dataType);

    /**
     * 查询推荐商品列表
     *
     * @param sex
     * @param ageStr
     * @return
     */
    List<Product> queryRecommendProductList(@Param("sex") Integer sex,
                                            @Param("ageStr") String ageStr,
                                            @Param("dataType") String dataType);

    /**
     * 查询推荐商品列表
     *
     * @param sex
     * @param ageStr
     * @return
     */
    List<ProductActivity> getRecommendActivityProductList(@Param("sex") Integer sex,
                                                          @Param("ageStr") String ageStr,
                                                          @Param("activityList") List<String> activityList);


    /**
     * 查询推荐商品列表
     *
     * @param sex
     * @param ageStr
     * @return
     */
    List<ProductActivity> getRecommendActivityProductListV2(@Param("sex") Integer sex,
                                                            @Param("ageStr") String ageStr,
                                                            @Param("activityType") String activityType,
                                                            @Param("dataType") String dataType);


//    /**
//     * 查询专栏商品列表
//     *
//     * @param specialId 专栏id
//     * @param type 专区类型
//     * @return
//     */
//    List<Product> queryProductListByNotSpecialId(@Param("specialId") Integer specialId, @Param("type") String type);

    /**
     * 根据ID获取商品
     *
     * @param id
     * @return
     */
    Product getProductById(@Param("id") Integer id);

    ProductMatching queryProductMatchingById(@Param("id") Integer id);

    ProductActivityMatching queryProductActivityMatchingById(@Param("id") Integer id);

    ProductActivity getProductActivityByProductId(@Param("id") Integer id);

    /**
     * 获取活动商品
     *
     * @param productId
     * @param activityType 活动类型
     * @return
     */
    ProductActivity getProductActivity(@Param("productId") Integer productId,
                                       @Param("activityType") String activityType);

    /**
     * 获取秒杀商品
     *
     * @return
     */
    List<Product> getNewKillProductList(@Param("dataType") String dataType, @Param("platformData") String platformData);


    List<ProductActivity> getProductActivityByProductIdV2(Integer productId);

    /**
     * 普通商品店铺推荐
     *
     * @param bankerId
     * @return
     */
    List<ProductResponse> getRecommend(Integer bankerId);

    Integer countProductNumByBankerId(Integer bankerId);

    Integer countFollowNumByBankerId(Integer bankerId);

    String findBrandStory(Integer bankerId);

    /**
     * 获取
     *
     * @param extra
     * @return
     */
    ActivityColumn getProductActivityColumn(String extra);

    List<ProductResponse> getProductListByColumnId(Integer id);

    List<ProductResponse> getFreeProductList();

    Integer countProductsNumByBankerId(Integer bankerId);

    List<Product> getNowAndTomorrowSecKillProducts(String dataType, String platformData);

    List<Product> getTomorrowSecKillProducts(String dataType, String platformData);

    List<Product> queryProductByIds(List<Integer> ids);

    List<ProductTinyResponse> queryProductTinyByIds(List<Integer> ids);

    List<ActivityProductResponse> findActivityList(@Param("activityType") String activityType, @Param("activityMax") BigDecimal activityMax, @Param("productName") String productName, @Param("platformData") String platformData);

    List<ActivityProductResponse> findActivityListFixPrice(@Param("activityType") String activityType, @Param("activityMax") BigDecimal activityMax,
                                                           @Param("productName") String productName, @Param("platformData") String platformData, @Param("fixPrice") BigDecimal fixPrice);

    List<ActivityProductResponse> findActivityListByRange(@Param("activityType") String activityType, @Param("activityMaxStart") BigDecimal activityMaxStart, @Param("activityMaxEnd") BigDecimal activityMaxEnd, @Param("platformData") String platformData);

    List<ActivityProductResponse> findActivityHostList(@Param("activityType") String activityType, @Param("num") int num);

    List<ProductListResponse> findList(String productName);

    BigDecimal queryTotalProductSubsidy(@Param("activityType") String activityType, @Param("platformData") String platformData);

    Integer queryTotalProductCount(@Param("activityType") String activityType, @Param("platformData") String platformData);

    Integer queryTotalProductCountAndActivityMax(@Param("activityType") String activityType, @Param("platformData") String platformData, @Param("activityMax") BigDecimal activityMax);

    List<Product> queryNewYearGoods(List<Integer> ids);

    Integer countProductNumInBrandSite(@Param("bankerId") Integer bankerId, @Param("platformData") String platformData);

    List<ProductShortResponse> getProductsbyBrandId(
            @Param("brandId") Integer brandId
            , @Param("platformData") String platformData
            , @Param("limitNum") int limitNum
            , @Param("productId") Integer productId);

    BrandProductResponse getBrandInfoByBrandId(@Param("brandId") Integer brandId);

    List<ProductResponse> getRecommendOther(@Param("bankerId") Integer bankerId
            , @Param("platformData") String platformData
            , @Param("activityType") String activityType);

    List<ProductResponse> getCashScoreProducts(@Param("platformData") String platformData);

    List<FollowBankerProductResponse> findListByBrandId(@Param("id") Integer id, @Param("num") Integer num, @Param("specialId") Integer specialId,@Param("platformData") String platformData);

    Integer countByBrandId(Integer id);

    /**
     * 获取当前品牌下的最低折扣
     * @param id:
     * @returns: java.lang.Integer
     * 
     */
    Double discountByBrandId(Integer id);

    List<ActivityProductResponse> findListByBrandIdAndPlatformData(@Param("id") Integer id, @Param("num") Integer num, @Param("specialId") Integer specialId, @Param("platformData") String platformData);

    Integer countByBrandIdAndPlatformData(Integer id, @Param("platformData") String platformData);

    List<OldForNewProductDto> findOldForNewList(@Param("columnId") Integer columnId, @Param("subsidyProductIds") List<Integer> subsidyProductIds, @Param("platformData") String platformData);

    List<PayAfterUseResponse> findPayAfterUseList();

    List<ProductShortResponse> findCashScoreZero(String platformData);

    List<ProductResponse> findByIds(@Param("ids") List<String> ids);

    List<ProductResponse> findBySpecialIdAndActivity(Integer specialId, @Param("activityType") String activityType, @Param("platformData") String platformData, @Param("consumerPower") String consumerPower);

    Integer queryByBrandIdAndPlatformCount(Integer id, @Param("platformData") String platformData);

    List<FollowBankerProductResponse> findListByBrandIdAndPlatform(@Param("id") Integer id, @Param("num") Integer num, @Param("specialId") Integer specialId, @Param("platformData") String platformData);

    List<AppNewLifeHallIndexOldForNewProductDto> findOldForNewListByAll(@Param("columnId") Integer columnId, @Param("subsidyProductIds") List<Integer> subsidyProductIds, @Param("platformData") String platformData);

    /**
     * 拼团猜你喜欢商品
     *
     * @param categoryId 二级分类id
     * @return
     */
    List<ProductResponse> getRecommendByGroup(Integer categoryId);

    /**
     * 查询活动商品列表
     *
     * @return
     */
    List<Product> queryActivityProductList(@Param("activityType") String activityType,
                                           @Param("columnId") Integer columnId,
                                           @Param("activityMaxStart") BigDecimal activityMaxStart,
                                           @Param("activityMaxEnd") BigDecimal activityMaxEnd,
                                           @Param("activityMin") BigDecimal activityMin,
                                           @Param("platformData") String platformData,
                                           @Param("consumerPower") String consumerPower,
                                           @Param("columnIdList") List<Integer> columnIdList,
                                           @Param("orderByIdList") List<Integer> orderByIdList,
                                           @Param("flag") Integer flag);

    /**
     * 获取活动商品列表排序id
     * @param activityType
     * @param platformData
     * @return
     */
    List<Integer>  queryActivityProductIdList (@Param("activityType") String activityType,
                                             @Param("columnId") Integer columnId,
                                             @Param("activityMaxStart") BigDecimal activityMaxStart,
                                             @Param("activityMaxEnd") BigDecimal activityMaxEnd,
                                             @Param("activityMin") BigDecimal activityMin,
                                             @Param("platformData") String platformData,
                                             @Param("consumerPower") String consumerPower,
                                             @Param("columnIdList") List<Integer> columnIdList,
                                             @Param("index") Integer index,
                                             @Param("pageSize") Integer pageSize);


    List<Product> queryActivityProductListNew(@Param("activityType") String activityType,
                                              @Param("platformData") String platformData,
                                              @Param("orderByIdList") List<Integer> orderByIdList,
                                              @Param("flag") Integer flag);

    List<ProductCategoryResp> selectCategoryByIds(@Param("ids") List<Integer> ids);

    List<Product> selectProductByTopCategoryIds(@Param("topCategoryIds") List<Integer> topCategoryIds,
                                                @Param("type") String type,
                                                @Param("dataType") String dataType,
                                                @Param("platformData") String platformData);

    List<Product> selectProductByTopCategoryIdsFixPrice(@Param("topCategoryIds") List<Integer> topCategoryIds,
                                                        @Param("type") String type,
                                                        @Param("dataType") String dataType,
                                                        @Param("platformData") String platformData, @Param("fixPrice") BigDecimal fixPrice);

    List<Product> selectProductByCategoryIds(@Param("categoryIds") List<Integer> categoryIds,
                                             @Param("type") String type,
                                             @Param("dataType") String dataType,
                                             @Param("platformData") String platformData);

    List<Product> getProductByCategoryIds(@Param("categoryIds") List<Integer> categoryIds,
                                          @Param("type") String type,
                                          @Param("dataType") String dataType,
                                          @Param("platformData") String platformData);

    List<Product> selectProductByCategoryIdsFixPrice(@Param("categoryIds") List<Integer> categoryIds,
                                                     @Param("type") String type,
                                                     @Param("dataType") String dataType,
                                                     @Param("platformData") String platformData, @Param("fixPrice") BigDecimal fixPrice);

    List<Product> selectProductByTopCategory(@Param("topCategoryIds") List<Integer> topCategoryIds, @Param("dataType") String dataType, @Param("activityTypeList") List<String> activityTypeList);

    List<Product> selectProductByCategorys(@Param("categoryIds") List<Integer> categoryIds, @Param("dataType") String dataType, @Param("activityTypeList") List<String> activityTypeList);

    List<Product> selectProductByThirdId(@Param("categoryIds") List<Integer> categoryIds, @Param("dataType") String dataType, @Param("activityTypeList") List<String> activityTypeList);

    List<Product> selectProductByThirdIdAndPlatform(@Param("categoryIds") List<Integer> categoryIds,
                                                    @Param("dataType") String dataType, @Param("activityTypeList") List<String> activityTypeList,
                                                    @Param("platformData") String platformData);

    List<Product> selectByIds(@Param("ids")List<Integer> ids,@Param("num")Integer num);

    List<Product> selectByIdsOrderByType(@Param("ids")List<Integer> ids, @Param("num")Integer num, @Param("type") String type);

    List<Product> selectByIdsOrderByTypeFixPrice(@Param("ids")List<Integer> ids, @Param("num")Integer num, @Param("type") String type, @Param("fixPrice") BigDecimal fixPrice);

    List<Product> getProductsOrderByType(@Param("ids")List<Integer> ids, @Param("num")Integer num, @Param("type") String type, @Param("fixPrice") BigDecimal fixPrice);

    List<FollowBankerProductResponse> selectProductByIds(@Param("ids")List<Integer> ids);

    List<FollowBankerProductResponse> selectProduct2TopCategory(@Param("topCategoryIds") List<Integer> topCategoryIds,@Param("brandId") Integer brandId,@Param("num") int num);

    List<FollowBankerProductResponse> selectProduct2Categorys(@Param("categoryIds") List<Integer> categoryIds,@Param("brandId") Integer brandId,@Param("num") int num);

    List<Product> queryActivityProductListRand(@Param("activityType") String activityType,
                                               @Param("columnId") Integer columnId,
                                               @Param("activityMaxStart") BigDecimal activityMaxStart,
                                               @Param("activityMaxEnd") BigDecimal activityMaxEnd,
                                               @Param("activityMin") BigDecimal activityMin,
                                               @Param("platformData") String platformData,
                                               @Param("consumerPower") String consumerPower,
                                               @Param("columnIdList") List<Integer> columnIdList);

    List<ActivityProductLabel> findProductLabel(Integer productId);

    List<ActivityProductLabel> findProductLabels(@Param("productIds")List<Integer> productIds);

    List<Product> findProductByColumIds(@Param("product") Product product,@Param("list") List<String> platformDataList);

    List<HighestVolumeProductVO> selectByHighestVolume();

    List<Product> selectProductImagesByActivityTypeLimit(@Param("activityType") String activityType, @Param("size") Integer size, @Param("platformData") String platformData);

    List<Product> selectProductImagesByActivityType(@Param("activityTypes") List<String> activityTypes, @Param("platformData") String platformData);

    Integer sumProductVolumeByActivityType(String activityType);

    List<Product> queryActivityRankList(@Param("ids") List<Integer> ids);

    /**
     * 根据商品名称查询商品-适用不同地区取品
     * @param orangePlatform 当前原始平台
     * @param provincePlatform 当前ip解析的地区平台
     * @param productName 商品关键词
     * @return List<Product>
     */
    List<Product> searchProductByNameForProvince(String orangePlatform,String provincePlatform,String productName);

    List<Product> getRecommendProduct(Integer bottomCategoryId,Integer categoryId,Integer topCategoryId,String platformData);

    void savaRedpacket(Integer productId,String token,String amount);

    int countRedpacket(String token,Integer productId);
}

